import axios from 'axios'
import router from '@/router'
import tokenManager from '@/utils/tokenManager'

// 创建axios实例
const request = axios.create({
  baseURL: 'http://localhost:8080', // 根据后端实际地址配置
  timeout: 5000
})

// 请求拦截器
request.interceptors.request.use(
  config => {
    const token = localStorage.getItem('token')
    if (token) {
      config.headers['Authorization'] = 'Bearer ' + token
    }
    return config
  },
  error => {
    return Promise.reject(error)
  }
)

// 响应拦截器
request.interceptors.response.use(
  response => {
    // 检查是否有新的token需要更新
    const newToken = response.headers['x-new-token']
    if (newToken) {
      localStorage.setItem('token', newToken)
      // 更新请求头中的token
      request.defaults.headers.common['Authorization'] = `Bearer ${newToken}`
    }
    
    // 如果是 blob 类型的响应，直接返回完整的 response 对象
    if (response.config.responseType === 'blob') {
      return response
    }
    
    // 统一处理后端的 ApiResponse 包装格式
    // 如果响应数据有 code 和 data 字段，说明是 ApiResponse 格式
    if (response.data && typeof response.data === 'object' && 
        'code' in response.data && 'data' in response.data) {
      
      // 检查是否成功
      if (response.data.code === 200) {
        // 返回 data 字段的内容，保持向后兼容
        return response.data.data
      } else {
        // 如果不是成功状态，抛出错误
        const error = new Error(response.data.message || '请求失败')
        error.code = response.data.code
        throw error
      }
    }
    
    // 对于非 ApiResponse 格式的响应（如文件下载等），直接返回 response.data
    return response.data
  },
  error => {
    if (error.response) {

      // 处理特殊状态码
      if (error.response.status === 401) {
        // Token 过期或无效，使用tokenManager统一处理
        tokenManager.handleTokenExpired()
        return Promise.reject(error)
      } else if (error.response.status === 403) {
        // 权限问题 - 可能是会话过期导致的

        // 检查是否是会话过期（根据错误信息判断）
        const errorMsg = error.response.data?.message || error.response.data?.error || ''
        if (errorMsg.includes('会话') || errorMsg.includes('session') || errorMsg.includes('登录') || errorMsg.includes('login') || errorMsg.includes('未登录')) {
          tokenManager.handleSessionExpired()
        } else {
          // 真正的权限问题，跳转到403页面
          router.push('/403')
        }
        return Promise.reject(error)
      }
      
      // 提取后端返回的详细错误信息
      let errorMessage = '未知错误'
      
      if (error.response.data) {
        // 检查是否是后端的 ErrorResponse 格式
        if (error.response.data.message) {
          errorMessage = error.response.data.message
        } else if (typeof error.response.data === 'string') {
          errorMessage = error.response.data
        } else if (error.response.data.error) {
          errorMessage = error.response.data.error
        }
      }
      
      // 创建一个包含详细错误信息的新错误对象
      const enhancedError = new Error(errorMessage)
      enhancedError.status = error.response.status
      enhancedError.code = error.response.data?.errorCode || error.response.status
      enhancedError.response = error.response  // 保留原始响应数据
      enhancedError.originalError = error
      
      return Promise.reject(enhancedError)
    }
    
    // 网络错误或其他错误
    const networkError = new Error(error.message || '网络连接失败')
    networkError.originalError = error
    return Promise.reject(networkError)
  }
)

export default request